import axios, { type AxiosResponse, type InternalAxiosRequestConfig } from 'axios';
import { ElMessage, ElMessageBox } from 'element-plus'; // 如果使用 Element Plus
import router from '../router/router'; // 导入你的路由实例

// 创建 axios 实例
const service = axios.create({
	baseURL: import.meta.env.DEV ? '' : import.meta.env.VITE_BASE_API || '', // 可从环境变量读取，默认使用相对路径
	timeout: 10000, // 超时时间
});

// 请求拦截器
service.interceptors.request.use(
	(config: InternalAxiosRequestConfig) => {
		// 在发送请求前做些处理，如添加 token
		const token = localStorage.getItem('token');
		if (token) {
			config.headers.Authorization = `Bearer ${token}`;
		}
		return config;
	},
	error => {
		return Promise.reject(error);
	},
);

// 响应拦截器
service.interceptors.response.use(
	(response: AxiosResponse) => {
		// 对响应数据做些处理，例如根据后端统一状态码进行提示
		const res = response.data;

		// 如果是文件流等二进制数据，直接返回
		if (response.config.responseType === 'blob' || response.config.responseType === 'arraybuffer') {
			return response;
		}

		if (res.code !== 200 && res.code !== undefined) {
			ElMessage({
				message: res.message || 'Error',
				type: 'error',
				duration: 5 * 1000,
			});
			return Promise.reject(new Error(res.message || 'Error'));
		} else {
			// 如果返回的直接是数据，则返回 data
			return res;
		}
	},
	error => {
		// 对响应错误做统一处理，例如处理 HTTP 状态码
		if (error.response) {
			const status = error.response.status;
			switch (status) {
				case 401:
					ElMessageBox.confirm('登录状态已过期，请重新登录', '提示', {
						confirmButtonText: '重新登录',
						cancelButtonText: '取消',
						type: 'warning',
					})
						.then(() => {
							localStorage.removeItem('token');
							router.push('/login');
						})
						.catch(() => {
							// 用户点击取消
						});
					break;
				case 403:
					ElMessage.error(`${status} 无权限访问该资源`);
					break;
				case 404:
					ElMessage.error(`${status} 请求的资源不存在`);
					break;
				case 500:
					ElMessage.error(`${status} 服务器内部错误`);
					break;
				case 502:
					ElMessage.error(`${status} 网关错误`);
					break;
				case 503:
					ElMessage.error(`${status} 服务不可用`);
					break;
				case 504:
					ElMessage.error(`${status} 网关超时`);
					break;
				default:
					ElMessage.error(error.response.data.message || `请求失败 (${status})`);
			}
		} else if (error.code === 'ECONNABORTED') {
			ElMessage.error('请求超时，请检查网络连接');
		} else if (error.message === 'Network Error') {
			ElMessage.error('网络连接异常，请检查网络设置');
		} else {
			ElMessage.error(error.message || '请求失败');
		}
		return Promise.reject(error);
	},
);
export const request = {
	get<T>(url: string, params = {}): Promise<T> {
		return service.get(url, { params }) as Promise<T>;
	},

	post<T>(url: string, data = {}): Promise<T> {
		return service.post(url, data) as Promise<T>;
	},

	put<T>(url: string, data = {}): Promise<T> {
		return service.put(url, data) as Promise<T>;
	},

	delete<T>(url: string, params = {}): Promise<T> {
		return service.delete(url, { params }) as Promise<T>;
	},
};
